package com.example.builder;

/**
 *
 * 建造者模式 是用来创建一种类型的复杂对象,通过设置不同的可选参数,定制化的创建不同的对象
 * 这个模式可以用来 初始化一些 三分的类 比如说 微信支付什么的
 */
public class RabbitClientBuilder {

    /**
     * 私有方法构造
     */
    private RabbitClientBuilder(Builder builder) {

    }

    public static class Builder {

        /**
         * ip
         */
        private String ip;

        /**
         * 端口
         */
        private int port;

        /**
         * 模式
         */
        private int mode;

        /**
         * 交换机
         */
        private String exchange;

        /**
         * 队列
         */
        private String queue;

        /**
         * 是否持久化
         */
        private boolean isDurable;


        public Builder setIp(String ip) {
            this.ip = ip;
            return this;
        }

        public Builder setPort(int port) {
            this.port = port;
            return this;
        }

        public Builder setExchange(String exchange) {
            this.exchange = exchange;
            return this;
        }

        public Builder setQueue(String queue) {
            this.queue = queue;
            return this;
        }

        public Builder setMode(int mode) {
            this.mode = mode;
            return this;
        }

        public Builder setDurable(boolean durable) {
            isDurable = durable;
            return this;
        }

        public RabbitClientBuilder builder() {
            //首先进行校验
            if (mode == 1) { //工作队列模式不需要设计交换机,但是队列名称一定要有
                if (exchange != null) {
                    throw new RuntimeException("工作队列模式无需设计交换机");
                }
                if (queue == null || queue.trim().equals("")) {
                    throw new RuntimeException("工作队列模式名称不能为空");
                }
                if (isDurable == false) {
                    throw new RuntimeException("工作队列模式必须开启持久化");
                }
            } else if (mode == 2) { //路由模式必须设计交换机,但是不能设计队列
                if (exchange == null) {
                    throw new RuntimeException("路由模式下必须设置交换机");
                }
                if (queue != null) {
                    throw new RuntimeException("路由模式无须设计队列名称");
                }
            }

            return new RabbitClientBuilder(this);
        }

    }

    public void sendMessage(String msg) {
        System.out.println("发送消息......");
    }

}
